#ifndef __STACK_H
#define __STACK_H

#include "list.h"

typedef List Stack;
typedef ListNode StackNode;

static inline Stack *stack_new()
{
    return list_new();
}

static inline void stack_empty(Stack *stack)
{
    return list_empty(stack);
}

static inline void stack_free(Stack *stack)
{
    return list_free(stack);
}

static inline void *stack_top(Stack *stack)
{
    return list_head(stack);
}

static inline int stack_depth(Stack *stack)
{
    return list_len(stack);
}

static inline bool stack_is_empty(Stack *s)
{
    return stack_depth(s) == 0;
}

static inline int stack_push(Stack *stack, void *data)
{
    return list_insert_head(stack, data);
}

static inline void *stack_pop(Stack *stack)
{
    return list_del_head(stack);
}

static inline int stack_push_node(Stack *stack, StackNode *node)
{
    return list_insert_head_node(stack, node);
}

static inline StackNode *stack_pop_node(Stack *stack)
{
    return list_del_head_node(stack);
}

#endif